package com.yida.common.core.utils.ip;

import java.io.IOException;
import java.io.InputStream;

import org.lionsoul.ip2region.xdb.Searcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.yida.common.core.utils.StringUtils;
import com.yida.common.core.utils.memory.MemoryUtils;

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.ClassPathResource;

/**
 * @author Administrator
 * @date 2023/11/10
 */
public class Ip2region2Utils {

    private static final Logger log = LoggerFactory.getLogger(Ip2region2Utils.class);

    /**
     * 将整个xdb文件加载到内存中(11M左右),此种创建方式支持多线程,因此只需要加载一次
     */
    // private final static Searcher searcher;
    // private static byte[] vIndex;

    // private static String dbPath;

    // 1、从 dbPath 加载整个 xdb 到内存。
    private static byte[] cBuff;

    static {
        try {

            ClassPathResource resource = new ClassPathResource("ip2region.xdb");
            // 获取真实文件路径 读路径就是一个死字
            // System.out.println("1:" + resource.getURL().getPath());
            InputStream inputStream = resource.getStream();
            if (MemoryUtils.getMaxMemoryInfo() > inputStream.available()) {
                // inputStream
                cBuff = IoUtil.readBytes(inputStream);

            }
            log.info("加载了ip2region.xdb文件,Searcher初始化完成!");
        } catch (Exception e) {
            log.error("初始化ip2region.xdb文件失败,报错信息:[{}]", e.getMessage(), e);
            throw new RuntimeException("系统异常!");
        }
    }

    /**
     * description 地址库查询
     *
     * @param ip 地址
     * @return java.lang.String
     * @version 1.0
     */
    public static String getRealAddress(String ip) {
        if (IpUtils.internalIp(ip)) {
            return "本地网络";
        }
        String result = "未知网络";
        Searcher searcher;
        try {
            // 加载地址库
            searcher = Searcher.newWithBuffer(cBuff);
            String region = searcher.search(ip);

            if (StringUtils.isNotEmpty(region)) {
                // 中国|0|福建省|厦门市|电信
                String[] splitIpInfo = region.split("\\|");
                String country = splitIpInfo[0];
                // 非中国直接返回国籍
                if (!"中国".equals(country)) {
                    return country;
                }
                // 国家+省+市
                return country + splitIpInfo[2] + splitIpInfo[3];
            }
            searcher.close();
        } catch (Exception e) {
            log.error("未知网络", e);
            return "未知网络";
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        System.out.println(Ip2region2Utils.getRealAddress("110.88.161.105"));
    }

}
